由於地震的關係,花了點時間在整理,假日兩天就這樣沒了,今天進度也一樣很糟糕,開始懷疑能不能完賽了...
接下來要實現消除與掉落的功能,這邊開始邏輯就會複雜了,需要有一些遞迴的概念
首先先定義消除方塊之前,需要帶入甚麼樣的參數
考量到會生成特殊道具,所以需要知道有哪幾個位置是一起消除的
大致上如下:
[[[0,0],[0,1],[0,2]], [[1,3],[1,4],[1,5]]]
有了input,接下來就是針對該格式來進行消除
def removeMatched(self, matches):
# 消除方塊
for match in matches:
for m in match:
match_x, match_y = m[0], m[1]
gem = self.getGemByPos(match_x, match_y)
self.gems_group.remove(gem)
self.all_gems[match_x][match_y] = None
# 方塊掉落
for x in range(NUMGRID):
# 這邊要由下往上判斷
for y in range(NUMGRID - 1, 0, -1):
if self.all_gems[x][y] == None:
self.dropPuzzle(x, y, 1)
pass
方塊掉落的部分,由於是由上往下掉,所以判斷會從下面開始,只要有空值從上方的方塊抓下來,如果上方方塊為None則會再往上抓
def dropPuzzle(self, x, y, drop_count):
if y - drop_count >= 0:
if self.all_gems[x][y- drop_count] != None:
self.all_gems[x][y] = self.all_gems[x][y- drop_count]
gem = self.getGemByPos(x, y)
gem.drop(drop_count)
self.all_gems[x][y- drop_count] = None
else:
self.dropPuzzle(x, y, drop_count + 1)
else:
# 產生新方塊
# self.gems_group.add(gem)
pass
return
再來針對方塊定義掉落的方法
def drop(self, count):
self.rect.y = self.rect.y + (GRIDSIZE*count)
方法都寫完之後,在run迴圈就要隨時去判斷有無需要消除的方塊,這邊有做個時間限制讓他不要消得太快
self.matches = None
# 如果有方塊符合,則消除
if self.matches != None and pygame.time.get_ticks() - match_ticks >= 500:
self.removeMatched(self.matches)
self.matches = None
match_ticks = pygame.time.get_ticks()
觸發的地方也寫好了,但我根本還沒有寫連三塊消除的功能,那只好先在某個地方代入資料進行測試
# 測試用
elif pygame.mouse.get_pressed()[2] == True:
self.matches = [[[3, 3], [4, 3]], [[4, 7], [5, 7]]]
到這邊實測了一下,雖然功能正常,但是因為有空白的區域所以左鍵點擊會報錯,明天會去做一下方塊生成的方法